#define _J_SINKRONIZACIJA_C_
#include "sinkronizacija.h"

#include "red.h"

#include "pozivi_jezgre.h"
#include "liste.h"
#include "razno.h"
#include "ispis.h"


extern j_red_t j_red[]; //pazi, ovo ne valja -> extern j_red_t *j_red; !!!
			//http://www.lysator.liu.se/c/c-faq/c-2.html

int j_dohvati_sem (void *param)
{
	int poc_vr, *pv = param;
	int id_reda;
	int8 sort;
	
	PARAMNULL(pv);
	poc_vr = *pv;

	sort = SORT_PRP;
	
	//dohvati red
	id_reda = j_dohvati_red(SEMAFOR, sort, 0);
	
	if (id_reda == -1)
		return -1; //nema slobodnog reda!

	//pocetna vrijednost
	j_red[id_reda].pr = poc_vr;

	return id_reda;
}

int j_obrisi_sem (void *param)
{
	int *pid = param, id;
	
	PARAMNULL(pid);
	id = *pid;
	
	return j_obrisi_red(id);
}

//Cekaj_OS
int j_cekaj_sem (void *param)
{
	int *pid = param, id;
	
	PARAMNULL(pid);
	id = *pid;

	if (j_provjeri_red(id) == -1)
		return -1;

	if (j_red[id].pr > 0)
		j_red[id].pr--;
	else
		j_stavi_u_red(id, NULL);

	return 0;
}

//Postavi_OS
int j_postavi_sem (void *param)
{
	int *pid = param, id;
	
	PARAMNULL(pid);
	id = *pid;

	if (j_provjeri_red(id) == -1)
		return -1;

	if (j_red[id].red.prvi != NULL)
		j_propusti_iz_reda(id, FALSE);
	else
		j_red[id].pr++;
	
	return 0;
}
